home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctj0587.arc / EMDUMP.ASM < prev    next >
Assembly Source File  |  1987-03-16  |  11KB  |  331 lines

  1.         PAGE    60,132
  2.         TITLE   EMDUMP - DEMO OF SUBROUTINE TO DUMP EMS MEMORY
  3.  
  4. STACK       SEGMENT WORD STACK 'STACK'
  5.             DB     100H DUP (?)
  6. STACK       ENDS
  7.  
  8. DATA        SEGMENT WORD PUBLIC 'DATA'
  9. HDRMSG       DB      0AH, 0DH, 'EMDUMP - Copyright 1987, '
  10.              DB      'John A. Lefor',0AH, 0DH,'$'
  11. EMMNAME      DB      'EMMXXXX0',0            ; NAME OF EMM
  12. NOEMMMSG     DB      0AH, 0DH, 'Unable to locate EMM  - '
  13.              DB      'EMDUMP terminates.$'
  14. KEYHITMSG    DB      0AH, 0DH,'      Press any key to continue'
  15.              DB      ' Esc to stop.$'
  16. NOGETMSG     DB      0AH, 0DH, 'Insufficient memory to save context,'
  17.              DB      ' EMDUMP Aborting.$'
  18. ERRMSG       DB      0AH, 0AH, 0DH, 'EMM reports error code: '
  19. ERRCODE      DB      'XX'
  20. ERREND       DB      '.$'
  21. DUMPLINE     DB    0AH, 0DH
  22. DUMPSEG      DB    'XXXX:'
  23. DUMPOFF      DB    'YYYY  '
  24. DUMPWORD     DB    8 DUP('ZZZZ ')
  25.              DB    '$'
  26. CONTEXTLEN   EQU   128
  27. CONTEXT      DB    CONTEXTLEN DUP(?)
  28. DATA        ENDS
  29.  
  30. CODE        SEGMENT PUBLIC 'CODE'
  31.             ASSUME CS:CODE,DS:DATA
  32.  
  33. FIVE         EQU     5
  34. ESCAPE       EQU     27
  35. DISPLAY      EQU     09H
  36. SCREENFULL   EQU     16
  37. PAGEFULL     EQU     (16*1024)/(SCREENFULL*16)
  38. DOS          EQU     21H
  39. KEYHIT       EQU     01H
  40. DISPCHAR     EQU     02H
  41. DOSOPEN      EQU     3DH
  42. READ         EQU     00H                 ; ACCESS MODE IS READ ACCESS
  43. COMPAT       EQU     00H                 ; FILE COMPATIBILITY MODE
  44. TERMINATE    EQU     4CH                     ; TERMINATE PROCESS
  45.  
  46. EMM          EQU     67H
  47. EMMSTATUS    EQU     40H
  48. EMMVERSION   EQU     46H
  49. EMMPAGECOUNT EQU     42H
  50. EMMPAGEFRAME EQU     41H
  51. EMMHANDLES   EQU     4BH
  52. EMMMAP       EQU     44H
  53. EMMALLOC     EQU     43H
  54. EMMDEALLOC   EQU     45H
  55. EMMGETSET    EQU     4EH
  56. EMMGET       EQU     0
  57. EMMSET       EQU     1
  58. EMMSIZE      EQU     3
  59. EMMSEG       EQU     00H
  60. EMMOFF       EQU     019EH           ; OFFSET FOR INT67 SEGMENT
  61.  
  62. HDRNAME      EQU     0AH             ; LOCATION OF DRIVER NAME IN HDR
  63.  
  64. PAGEZERO     EQU     00H
  65. PAGETHREE    EQU     03H
  66.  
  67. ;   ESTABLISH IF AN EMM EXISTS IN THE SYSTEM USING
  68. ;   THE OPEN HANDLE METHOD
  69.  
  70. START:
  71.            MOV     AX, DATA
  72.            MOV     DS, AX                  ; LOAD DATA SEGMENT
  73.            MOV     DX, OFFSET HDRMSG       ; DISPLAY COPYRIGHT NOTICE
  74.            MOV     AH, DISPLAY
  75.            INT     DOS
  76.  
  77. ;   SEE IF EMS IS AVAILABLE USING THE INTERRUPT VECTOR METHOD
  78.  
  79.            MOV     AX, EMMSEG              ; PLACE SEGMENT ADDR
  80.            MOV     ES, AX                  ; INTO ES REG
  81.            MOV     BX, EMMOFF              ; EMM VECTOR OFFSET
  82.            CLI                             ; DISABLE INTERRUPTS
  83.            MOV     AX, ES:[BX]             ; GET SEGMENT REG OF INT
  84.            STI                             ; RE-ENABLE INTERRUPTS
  85.            MOV     ES, AX                  ; GET INTERRUPT SVC SEG
  86.            MOV     DI, HDRNAME             ; ADDR OF DEV DRIVER NAME
  87.            MOV     SI, OFFSET EMMNAME      ; DS:SI -> EMMXXXX0
  88.            MOV     CX, 8                   ; FOR COMPARE
  89.            REP     CMPSB                   ; IS IT EMM DEVICE
  90.            JE      EMMHERE
  91.  
  92. ;          IF NOT EMM, TERMINATE PROGRAM
  93.  
  94.            MOV     DX, OFFSET NOEMMMSG
  95.            MOV     AH, DISPLAY
  96.            INT     DOS
  97.            JMP     END
  98.  
  99. EMMHERE:
  100. ;    EMS IS PRESENT, CHECK EMM STATUS THEN ALLOCATE
  101. ;    SPACE IN EXPANDED MEMORY.
  102.  
  103.            MOV     AH, EMMSTATUS           ; REQUEST STATUS
  104.            INT     EMM                     ; CALL THE EMM
  105.            OR      AH, AH                  ; TEST RC
  106.            JZ      ALLOCMEM                ; IF ZERO, ALL IS WELL
  107.            CALL    EMMERROR
  108.            JMP     END                     ; IF ERROR, ALL DONE
  109.  
  110. ALLOCMEM:
  111.            MOV     AH, EMMALLOC            ; REQUEST EMM PAGES
  112.            MOV     BX, 1                   ; NEED ONLY ONE PAGE
  113.            INT     EMM                     ; GET THE PAGE
  114.            OR      AH, AH                  ; TEST RC
  115.            JZ      MAPPAGE                 ; IF OK MAP THE PAGE
  116.            CALL    EMMERROR                ; OTHERWISE DISPLAY ERROR
  117.            JMP     END
  118.  
  119. ;    TO FILL THE PAGE WE FIRST NEED THE BASE ADDRESS OF
  120. ;    THE PAGE, THEN WE MUST MAP IT INTO MEMORY.
  121.  
  122. MAPPAGE:
  123.            MOV     AL,PAGEZERO             ; PLACE IN PAGE ZERO
  124.            MOV     BX, 0                   ; USING PAGE ZERO
  125.            MOV     AH, EMMMAP              ; MAP MEMORY
  126.                                     ; DX IS STILL HANDLE FROM ALLOC
  127.            INT     EMM                     ; CALL EMM
  128.            OR      AH, AH                  ; TEST RC
  129.            JZ      GETBASE                 ; IF OK, GET BASE ADDR
  130.            CALL    EMMERROR
  131.            JMP     END
  132.  
  133. GETBASE:
  134.            MOV     AH, EMMPAGEFRAME        ; GET PF ADDRESS
  135.            INT     EMM                     ; CALL EMM
  136.            OR      AH, AH                  ; TEST RC
  137.            JZ      FILLPAGE                ; IF ZERO, FILL THE PAGE
  138.            CALL    EMMERROR                ; ELSE REPORT ERROR
  139.            JMP     END
  140.  
  141. FILLPAGE:
  142.            MOV     ES, BX                  ; ES -> PAGE FRAME
  143.            MOV     BX, 0                   ; 0 IS INDEX THRU PAGE
  144.            MOV     CX, (16*1024)/2         ; CX IS # OF WORDS
  145.            MOV     AX, 0                   ; AX IS VALUE
  146. LOOPAGE:
  147.            MOV     ES:[BX], AX             ; PLACE VALUE IN EMS
  148.            INC     AX
  149.            INC     BX
  150.            INC     BX                      ; -> NEXT WORD IN EMS
  151.            LOOP    LOOPAGE                 ; LOOP THRU EMS
  152.  
  153. ;   AN EMS PAGE HAS BEEN FILLED NOW DUMP EMS MEMORY
  154.  
  155.            MOV     AX, 0                   ; AX IS PAGE TO DUMP
  156.                                            ; DX IS HANDLE TO DUMP
  157.            CALL    EMSDUMP                 ; CALL DUMP ROUTINE
  158.  
  159. ;   NOW THAT WE ARE DONE, DEALLOCATE THE PAGE USED
  160.  
  161.            MOV     AH, EMMDEALLOC          ; REQUEST DEALLOC
  162.                                            ; DX HAS HANDLE
  163.            INT     EMM                     ; CALL EMM
  164.            OR      AH, AH                  ; TEST RC
  165.            JZ      END
  166.            CALL    EMMERROR
  167. END:
  168.            MOV     AL, 0                   ; ZERO RETURN CODE
  169.            MOV     AH, TERMINATE           ; END PROGRAM
  170.            INT     DOS
  171.         PAGE
  172. EMSDUMP    PROC    NEAR
  173.  
  174. ;    ROUTINE TO DUMP TO THE SCREEN A PAGE OF EMS MEMORY
  175. ;            CALL EMSDUMP WITH
  176. ;                 AX CONTAINING PAGE NUMBER
  177. ;                 DX CONTAINING HANDLE
  178.  
  179.            PUSH    AX
  180.            PUSH    BX
  181.            PUSH    CX
  182.            PUSH    DX
  183.            PUSH    DI
  184.            PUSH    ES
  185.  
  186. ;    FIRST, SAVE THE CONTEXT OF THE EMM SO AS NOT TO UPSET
  187. ;    THE CALLERS USE OF EXPANDED MEMORY
  188.  
  189.            MOV     AH, EMMGETSET
  190.            MOV     AL, EMMSIZE
  191.            INT     EMM
  192.            OR      AH, AH                  ; TEST RET CODE
  193.            JZ      CHKSIZE
  194.            CALL    EMMERROR
  195.            JMP     END
  196.  
  197. CHKSIZE:
  198.            CMP     AL, CONTEXTLEN          ; IS OUR CONTEXT ARRAY
  199.                                            ; LARGE ENOUGH?
  200.            JG      DOGET                   ; IF SO, DO THE GET
  201.            MOV     DX, OFFSET NOGETMSG
  202.            MOV     AH, DISPLAY
  203.            INT     DOS
  204.            JMP     END
  205. DOGET:
  206.            MOV     AH, EMMGETSET
  207.            MOV     AL, EMMGET              ; GET EMM CONTEXT
  208.            MOV     DI, OFFSET CONTEXT
  209.            PUSH    DS
  210.            POP     ES                      ; ES:DI -> CONTEXT ARRAY
  211.            INT     EMM
  212.            OR      AH, AH
  213.            JZ      CONTEMD
  214.            CALL    EMMERROR
  215.            JMP     END
  216.  
  217. ;  NOW THE CONTEXT HAS BEEN SAVED, WE CAN MODIFY EXPANDED MEMORY
  218.  
  219. CONTEMD:
  220.            MOV     BX, AX                  ; LOGICAL PAGE IN BX
  221.            MOV     AL, PAGETHREE           ; PHYSICAL PAGE IN AL
  222.            MOV     AH, EMMMAP              ; DO A MAP MEMORY
  223.                                            ; HANDLE IN DX
  224.            INT     EMM                     ; CALL EMM
  225.            OR      AH, AH                  ; TEST RC
  226.            JZ      GETADDR
  227.            CALL    EMMERROR
  228.            JMP     END
  229.  
  230. GETADDR:
  231.            MOV     AH, EMMPAGEFRAME        ; REQUEST PAGE FRAME
  232.            INT     EMM                     ; CALL EMM
  233.            OR      AH, AH                  ; TEST RC
  234.            JZ      DUMPPAGE
  235.            CALL    EMMERROR
  236.            JMP     END
  237.  
  238. DUMPPAGE:
  239.  
  240. ;    PLACE THE PAGE FRAME SEGMENT IN DUMP LABEL
  241.  
  242.            MOV     AX, BX
  243.            MOV     DI, OFFSET DUMPSEG
  244.            CALL    PRTHEX
  245.  
  246. ;    THE PAGE TO BE DUMPED IS IN PHYSICAL
  247. ;    PAGE THREE.  DUMP THE DATA TO THE SCREEN
  248.  
  249.            MOV     ES, BX               ; ES -> PAGE FRAME
  250.            MOV     BX, 0C000H           ; BX IS OFFSET WITHIN PAGE
  251.            MOV     CX, PAGEFULL         ; NUMBER OF PAGES TO FILL
  252. NEXTPAGE:
  253.            PUSH    CX
  254.            MOV     CX, SCREENFULL
  255. NEXTLINE:
  256.            PUSH    CX                      ; LOOP THRU A SCREEN
  257.            MOV     AX, BX
  258.            MOV     DI, OFFSET DUMPOFF
  259.            CALL    PRTHEX
  260.            MOV     CX, 8                   ; CX IS WORDS TO CONVERT
  261.            MOV     DI, OFFSET DUMPWORD     ; DI -> OUTPUT LINE
  262. DLINE:
  263.            MOV     AX, ES:[BX]             ; AX IS WORD
  264.            CALL    PRTHEX
  265.            INC     BX                      ; -> NEXT WORD
  266.            INC     BX
  267.            ADD     DI, FIVE               ; -> NEXT DISPLAY
  268.            LOOP    DLINE
  269.  
  270. ;    THE LINE HAS BEEN FORMATTED, PRINT IT ON THE SCREEN
  271.  
  272.            MOV     DX, OFFSET DUMPLINE     ; DX -> LINE
  273.            MOV     AH, DISPLAY             ; REQUEST PRINT
  274.            INT     DOS
  275.  
  276. ;          COME TO END OF LINE TRY TO FINISH A SCREEN
  277.  
  278.            POP     CX
  279.            LOOP    NEXTLINE
  280.            MOV     DX, OFFSET KEYHITMSG
  281.            MOV     AH, DISPLAY
  282.            INT     DOS
  283.            MOV     AH, KEYHIT
  284.            INT     DOS
  285.            CMP     AL, ESCAPE
  286.            JE      ENDUMP
  287.            POP     CX
  288.            LOOP    NEXTPAGE
  289.            JMP     TERMDMP
  290. ENDUMP:    POP     CX
  291.  
  292. ;   RESTORE EXPANDED MEMORY CONTEXT BEFORE RETURNING TO CALLED
  293.  
  294.            MOV     AH, EMMGETSET
  295.            MOV     AL, EMMSET
  296.            MOV     SI, OFFSET CONTEXT
  297.            INT     EMM
  298.            OR      AH, AH
  299.            JZ      TERMDMP
  300.            CALL    EMMERROR
  301.            JMP     END
  302.  
  303. TERMDMP:   POP     ES
  304.            POP     DI
  305.            POP     DX
  306.            POP     CX
  307.            POP     BX
  308.            POP     AX
  309.            RET
  310. EMSDUMP    ENDP
  311.         PAGE
  312. EMMERROR   PROC    NEAR
  313.  
  314. ;    ROUTINE TO DISPLAY EMM ERROR MESSAGES
  315. ;    PRESUMES AH CONTAINS THE ERROR CODE
  316.  
  317.            MOV     DI, OFFSET ERRCODE
  318.            CALL    PRTHEX                  ; FORMAT THE HEX
  319.            MOV     AX,'$.'
  320.            MOV     WORD PTR ERREND, AX     ; TERMINATE MESSAGE
  321.            MOV     DX, OFFSET ERRMSG
  322.            MOV     AH, DISPLAY
  323.            INT     DOS
  324.            RET
  325. EMMERROR   ENDP
  326.  
  327. INCLUDE PRTPROC.ASM       ; INSERT CONVERSION UTILITIES ROUTINES
  328.  
  329. CODE       ENDS
  330.            END    START
  331.